﻿using System;

namespace StockLib
{
    public class StockConst
    {
        public const string INDEX_SZZS = "1A0001";     // 上证指数        
        public const string INDEX_SZAG = "1A0002";     // 上证A股
        public const string INDEX_SZBG = "1A0003";     // 上证B股
        public const string INDEX_SZYBL = "1A0009";    // 上证180指数
        public const string INDEX_SZNCZ = "399001";    // 深证成指
        public const string INDEX_SZNZZ = "399106";    // 深证综指
        public const string INDEX_SZNCFAZ = "399002";  // 深证成份A指
        public const string INDEX_SZNCFBZ = "399003";  // 深证成份B指
        public const string INDEX_SZNZXBZ = "399005";  // 深证中小板指
        public const string INDEX_SZNFIRST = "000001"; // 深证第一支股票
        public const string INDEX_SHAFIRST = "600000"; // 上证第一支股票

    }

    public enum StockMarket
    {
        Unknown = 0x00,	    // 未知
        SHSE = 0x01,	    // 上海证券交易所
        SZSE = 0x02,	    // 深圳证券交易所
        HKEX = 0x03,	    // 香港联合交易所
        TBSE = 0x04,	    // 台北证券交易所
        TKSE = 0x05,	    // 东京证券交易所
        LSE = 0x06,	        // 伦敦证券交易所
        FLKFSE = 0x07,	    // 法兰克福证券交易所
        NYSE = 0x08,	    // 纽约证券交易所
        NASDAQ = 0x09,	    // 纳斯达克证券交易所
    }

    public enum StockType
    {
        None = 0x00,
        shIndex = 0x10,	        //	上海指数
        shA = 0x11,	            //	上海A股
        shB = 0x12,	            //	上海B股
        shBond = 0x13,	        //	上海债券
        shRight = 0x14,	        //	上海权证
        shBonus = 0x15,	        //	上海红利
        shAdmeasure = 0x16,	    //	上海配股
        szIndex = 0x20,	        //	深圳指数 0x20
        szA = 0x21,	            //	深圳A股 0x21
        szB = 0x22,	            //	深圳B股 0x22
        szBond = 0x23,	        //	深圳债券 0x23
        szRight = 0x24,	        //	深圳权证 0x24
        szBonus = 0x25,	        //	深圳红利 0x25
        szAdmeasure = 0x26,	    //	深圳配股 0x26
        szMse = 0x27,	        //	深圳中小企业
        szGem = 0x28,           //  深圳创业板
    }

    public enum DataType
    {
        Unknown = 0x00,		// 未知数据
        Info = 0x01,		// 股票信息
        K = 0x02,		    // K线数据
        XDR = 0x03,		    // 权息资料
        Finance = 0x04,	    // 财务数据
        Base = 0x05,	    // F10资料
        News = 0x06,		// 新闻资讯
        Report = 0x07,		// 行情刷新数据
        Minute = 0x08,		// 行情分时数据
        Outline = 0x09,		// 行情额外数据
        Code = 0x0A,		// 股票代码数组
        Multisort = 0x0B,   // 综合排名
        Tick = 0x0C,		// 成交明细
    }

    public enum UserDataType
    {
        Unknown = 0x00,		// 未知数据
        Domain = 0x01,		//
        Block = 0x02,		//
        Profile = 0x03,		//
        Tab = 0x04,		//
    }

    public enum KType
    {
        None = 0x00,
        Tick = 0x01,
        Min = 0x02,
        Min5 = 0x03,
        Min15 = 0x04,
        Min30 = 0x05,
        Min60 = 0x06,
        Day = 0x07,
        Week = 0x08,
        Month = 0x09,
        Max = 0x09,
    }

    public enum KLineType
    {
        HollowLine = 0x01,
        SolidLine = 0x02,
        AmericaLine = 0x03,
        CloseLine = 0x04,
    }

    public enum MultisortType
    {
        Rise = 0x01,	    // 涨幅
        Fall = 0x02,	    // 跌幅
        RiseMin5 = 0x04,	// 5分钟涨幅
        FallMin5 = 0x08,	// 5分钟跌幅
        BSRatioAsc = 0x10,	// 委比前六
        BSRatioDesc = 0x20,	// 委比后六
        Diff = 0x40,	    // 震幅
        VolRatio = 0x80,	// 量比
        Amount = 0x100,	    // 总金额
    }

    public enum ReportType
    {
        Unknown = 0x00,	    // 未知
        Quarter = 0x01,	    // 第一季度季报
        Mid = 0x02,	        // 中报
        Quarter3 = 0x03,	// 第三季度季报
        Annals = 0x04,	    // 年报
    }

    /// <summary>
    /// 历史数据
    /// </summary>
    public class KData
    {
        public StockMarket Market { get; set; }     // 证券市场类型,see CStock::StockMarket
        public string Code { get; set; } 		    // 证券代码
        public int Time { get; set; } 				// 时间　与m_date一致．如果是是某日，则小时分秒均为0
        public float Close { get; set; }		    // 昨收（元）
        public float Open { get; set; }				// 今开（元）
        public float High { get; set; }				// 最高（元）
        public float Low { get; set; }				// 最低（元）
        public float Volume { get; set; }			// 成交量（股）
        public float Amount { get; set; }			// 成交额（元）
        public int Advance { get; set; }		    // 上涨个数，仅指数有效
        public int Decline { get; set; }		    // 下跌个数，仅指数有效

        public DateTime Date
        {
            get
            {
                return TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)).AddSeconds(Time);
            }
        }

        public float[] Prices
        {
            get
            {
                return new float[] { Open, Close, High, Low };
            }
        }

        public float VolumeHuman
        {
            get
            {
                return Volume / 1000;
            }
        }

        public float AmountHuman
        {
            get
            {
                return Amount / 1000000;
            }
        }
    }

    /// <summary>
    /// 分时数据
    /// </summary>
    public class MinuteData
    {
        public int Time { get; set; }               // UCT
        public float Price { get; set; }            // 价格
        public float Volume { get; set; }           // 成交量
        public float Amount { get; set; }           // 成交额
    }

    /// <summary>
    /// 除权数据
    /// </summary>
    public class XdrData
    {
        public StockMarket Market { get; set; }     // 证券市场类型
        public string Code { get; set; } 		    // 证券代码
        public int Date { get; set; } 				// 日期	Format is XXMMDDHHMM for 5min, Format is YYYYMMDD for day
        public int Time { get; set; } 				// 时间　与m_date一致．如果是是某日，则小时分秒均为0
        public float Give { get; set; } 			// 每股送
        public float Pei { get; set; } 				// 每股配
        public float PeiPrice { get; set; } 		// 配股价,仅当 m_fPei!=0.0f 时有效
        public float Profit { get; set; } 			// 每股红利
    }

    /// <summary>
    /// 财务信息数据
    /// </summary>
    public class FinanceData
    {
        public StockMarket Market { get; set; }             // 证券市场类型
        public string Code { get; set; }		            // 证券代码
        public int ReportDate { get; set; }		            // 报告时间
        public int ReportType { get; set; }		            // 报告类型：年报、中报、季报
        public float ErateDollar { get; set; }		        // 当期美元汇率
        public float ErateHkDollar { get; set; }	        // 当期港币汇率

        // ★偿债能力
        public float RatioLiquidity { get; set; }			// 流动比率
        public float RatioQuick { get; set; }				// 速动比率
        public float VelocityReceivables { get; set; }	    // 应收帐款周率

        // ★经营能力
        public float VelocityMerchandise { get; set; }	    // 存货周转率
        public float MainIncome { get; set; }				// 主营业务收入
        public float CashPs { get; set; }					// 每股净现金流量

        // ★盈利能力
        public float ProfitMargin { get; set; }		        // 主营业务利润率 %
        public float NetAssetYield { get; set; }			// 净资产收益率 %

        // ★资本结构
        public int DateBegin { get; set; }				    // 上市日期 Format is YYYYMMDD
        public float ShareCountTotal { get; set; }		    // 总股本
        public float ShareCountA { get; set; }			    // 流通A股
        public float ShareCountB { get; set; }			    // 流通B股
        public float ShareCountH { get; set; }			    // 流通H股
        public float ShareCountNational { get; set; }	    // 国有股
        public float ShareCountCorp { get; set; }		    // 法人股
        public float ProfitPsud { get; set; }				// 每股未分配利润
        public float Asset { get; set; }					// 总资产
        public float RatioHolderRight { get; set; }		    // 股东权益比率
        public float RatioLongDebt { get; set; }			// 长期负债率
        public float RatioDebt { get; set; }				// 资产负债率

        // ★投资收益能力
        public float NetAssetPs { get; set; }	            // 每股净资产
        public float NetAssetPsRegulate { get; set; }	    // 调整每股净资产
        public float Eps { get; set; }						// 每股收益
        public float EpsDeduct { get; set; }				// 扣除后每股收益
        public float NetProfit { get; set; }				// 净利润
        public float MainProfit { get; set; }				// 主营业务利润
        public float TotalProfit { get; set; }			    // 利润总额

        // ★增长率
        public float ProfitInc { get; set; }				// 主营利润增长率%
        public float IncomeInc { get; set; }				// 主营收入增长率%
        public float AssetInc { get; set; }			        // 总资产增长率%

        // ★技术数据统计值
        public float YieldAverage { get; set; }			    // 平均收益率%
        public float YieldStddev { get; set; }		        // 收益标准差%
        public float Beite { get; set; }				    // β值

        public string CodeKey
        {
            get { return Market.ToString().ToUpper() + Code; }
        }
    }

    /// <summary>
    /// 行情数据
    /// </summary>
    public class ReportData
    {
        public StockMarket Market { get; set; }		    // 证券市场类型
        public string Code { get; set; }		        // 证券代码
        public string Name { get; set; }		        // 证券名称
        public int Time { get; set; }					// 交易时间
        public int Flag { get; set; }					// 停牌标志
        public float Close { get; set; }			    // 昨收（元）
        public float Open { get; set; }					// 今开（元）
        public float High { get; set; }					// 最高（元）
        public float Low { get; set; }					// 最低（元）
        public float New { get; set; }					// 最新（元）
        public float Volume { get; set; }				// 成交量（股）
        public float Amount { get; set; }				// 成交额（元）

        private float[] _buyPrice = new float[5];	    // 申买价1,2,3,4（元）
        private float[] _buyVolume = new float[5];		// 申买量1,2,3,4（股）
        private float[] _sellPrice = new float[5];		// 申卖价1,2,3,4（元）
        private float[] _sellVolume = new float[5];     // 申卖量1,2,3,4（股）

        public string CodeKey
        {
            get { return Market.ToString().ToUpper() + Code; }
        }

        public float[] BuyPrice
        {
            get { return this._buyPrice; }
            set { this._buyPrice = value; }
        }

        public float[] BuyVolume
        {
            get { return this._buyVolume; }
            set { this._buyVolume = value; }
        }

        public float[] SellPrice
        {
            get { return this._sellPrice; }
            set { this._sellPrice = value; }
        }

        public float[] SellVolume
        {
            get { return this._sellVolume; }
            set { this._sellVolume = value; }
        }
    }
    

    public class BaseData
    {
        public string Column { get; set; }
        public string Content { get; set; }
    }
}